Hey All,
Here's the final changelog for 0.3.3, which will be live on Monday.
[hidden]
Voxatron v0.3.3
Added: Custom inventories
Added: Music pattern sequencer
Added: Multiplayer selection
Added: Bloot: Title page, match logic, music
Added: The Jelly Room
Added: PREV field in activation controller
Added: Audio chooser
Added: Fold-out item creation menu
Added: Scrollwheel / mb3 camera control
Added: Script editor (scripts don't run yet though!)
Added: Shortcut keys for looping in prop editor
Added: Emitters can spawn props, audio and doors
Added: Trigger conditions host:inventory and actor:modifier
Added: Activation controllers for audio and aliases
Added: Total play time displayed on cart completion
Added: Emitted objects can optionally inherit heading and facing rotations
Changed: Can now sink in water by increasing object gravity
Changed: .pov exporter merges sequential voxels of same colour
Changed: Animation completion does not cause parent activation controller to expire
Changed: Can use go_to_room internal script with current room number
Changed: Hoisting is stiffer / more reliable
Changed: Can press button to restart after dying after only 1 second (was 2)
Changed: Doors do not warp in if they are occupied or triggered at t==0
Fixed: Doors only reporting occupied event on room entry
Fixed: Water: more robust wading, transitioning between swimming and standing.
Fixed: rand bullet duration
Fixed: incremental item collection
Fixed: aliased modifiers evaluating dereferenced parent
Fixed: emitter id == 0 clobbered on paste
Fixed: cut and pasting object definitions generates new ids
Fixed: actor:time in microscript statements
Fixed: actor:m_state.* called from room object activation controller
Fixed: Inactive modifier attribute values shown from incorrect parent
Fixed: Monsters don't run at full speed at player 2
Fixed: restarting room clobbers total_time_taken
Fixed: broken wall connectivity in small rooms
Fixed: actor state flags not set on zeroth frame
Fixed: Stand-alone emitter remains dormant forever even when duration/bursts have expired
Fixed: Barrel sometimes explodes when thrown from fast run
Fixed: Crash event triggered by carrying actor
Fixed: Walls do not extend down in liquid based rooms
Fixed: Player:super_state:died query sometimes gives false negative
Fixed: Pickups warping in inside player sometimes not immediately collected
Fixed: Room switching sometimes not triggered when carrying other player through door
Fixed: audio editor state is initialised with bad values after new sound created
Fixed: monster accel halved when mode:wandering
Fixed: Joystick not responding when left stick is up to the left
Fixed: death-triggered events don't fire when death caused by actor collision event





The first PICO-8 Jam has ended, and peer ratings have been tabulated and verified. Thanks so much to all participants for making the jam a wonderful event and for producing an excellent collection of rain-themed cartridges. It was a close one, with only a difference of 0.04 PICO-8 stars (out of 8) between the two highest-rated entries. With an average of 6.92 stars, the winner is.. drumroll..
Frog Home! By JTE! white noise cheering sound
Congratulations JTE, and you'll be receiving a small prize in the mail from PICO-8 HQ -- a commemorative plastic coaster depicting your cartridge, along with a PICO-8 canvas bag.
With an extremely close 6.88 stars, is Benjamin Soulé's Rainmaker:
Also close behind were Rain Culture by NuSan, Tea by moonmagic, and the equally heart-melting Rainy Day Friends by electricgryphon.
Stay tuned for the next Jam, which will be in the first quarter of 2016. And if you're not burnt out from jamming or missed this one, join me for Ludum Dare this coming weekend!
You can view all of the P8JAM1 entries here, or directly play the carts mentioned in this post below.





The first PICO-8 Jam is approaching!
Following on from this thread, here's an invite cart to make it legit:

Duration: The Jam will take place from 00:00 PST on the 21st of November 2015 and will finish at 24:00 PST on the 29th. So, it spans 2 weekends and 5 weekdays. You can spend as much or little time on your carts as you like. Tiny silly cartridges are more than welcome.
Theme: As is customary with other jams, a theme will be posted at the start and the goal is simply to make a cart (or some carts) during the jam that reflect your interpretation of the theme. Any type of cartridge is ok: games, toys, demos, music carts or pixels.










Hey All
There's a new version of the BBS live now. It's still a little rough -- let me know in the comments if you find something weird going on. I'll be tweaking and extending it over the next month or so.
New stuff:
-
Cartridge view. Carts are listed in the order they are posted rather than in the order of thread activity.
- Creative Commons tags.
The Terms of Use no longer require users to grant permission to use and remix cartridges. Instead, you can tag your cartridge under the CC4-ATTR-NC-SA license. In cartridge view, you can filter by this license.
On your profile page, click "Cartridges" and then "Edit Cartridges" for more information and to release your carts under CC4-ATTR-NC-SA.
- User Blogs







You can find it on your Updates page. The new builds should be up on Humble soon too (check the version numbers on the files).
This is a quick bug-fixing update. Due to a rogue dev-debug-mode flag being mistakenly switched on in 0.1.2, much of the standard Lua library was accessible. So if you've started using PICO-8 recently, not knowing the library is not supposed to be there and tried to use it, sorry about the confusion!
v0.1.3 Changes:
Added: paste into commandline
Fixed: lua standard libraries accessible
Fixed: command-line loading doesn't work
Fixed: music pattern finished too early when all tracks set to looping
Fixed: peek()ing odd bytes in sfx address space masks bit 7
Fixed: cstore and reload from code space should have no effect







Check your updates page!
Note: If you bought PICO-8 (rather than Voxatron), it isn't possible yet to activate your Lexaloffle account from Humble. I've been activating accounts manually, so if you purchased PICO-8 very recently and don't see it show up yet, please check back in a day or so. The Humble Bundle library builds should be live soon too.
New stuff: HTML5 exporter, 8-player joystick support, cartridge save data.
To export your cartridge as a stand-alone html5 version:
EXPORT BLAH.HTML |
Open the folder (FOLDER) and you should be able to see BLAH.HTML and BLAH.JS
Here's a demo of cartridge saving. Note that save data is not persistent yet in the web version:






Just a quick note for blog-checkers, Voxatron 0.3.3 and PICO-8 0.1.2 are both arriving this month.
I'll go into detail about new Voxatron developments and plans after the update's out, but here's a quick preview until then.
Also, here's the current changelog for pico-8 0.1.2. There are still known issues that I've rolled over to 0.1.3 but let me know if I missed something small that's easy to fix!










Issue #1 of the community-made PICO-8 zine is out! You can order the 48-page printed version via pico8fanzine.bigcartel.com for a nominal fee, or download the pdf (mirror).
Much respect to @arnaud_debock and contributors for putting this together -- it's humbling to see the world of PICO-8 extended in such a creative and kick-ass way. Issue #1 includes artwork and articles by @dotsukiHARA, @bitmoo, @TheRealMolen, @pizzamakesgames, @PROGRAM_IX, @aliceffekt, @modernmodron and @terrycavanagh. I also took the opportunity to write something on the history of PICO-8 and it's relationship with other Lexaloffle projects.



This cart demonstrates basic wall collisions, animation and actor-based world objects. I hope it's useful either as something to study for ideas, or as a starting template for a platformer or overhead map-based game. I noticed a few carts reusing stuff from Jelpi, which is great -- but Jelpi might be a little complex to get started with.
See move_actor() for the important part:
if not solid_area(a.x + a.dx, a.y, a.w, a.h) then a.x += a.dx else -- otherwise bounce a.dx *= -a.bounce sfx(2) end -- ditto for y if not solid_area(a.x, a.y + a.dy, a.w, a.h) then a.y += a.dy else a.dy *= -a.bounce sfx(2) end |
The collisions work like this:
- wall sprites are tagged with flag 1 (orange) in the sprite editor
- solid_area() checks to see if a given rectangle in the map overlaps with any walls
- each actor has a velocity (a.dx, a.dy)
- in move_actor(): before moving an actor along each axis (x, then y), the new potential collision rectangle of the actor is tested against the map. Note the "+ a.dx" in the call to solid_area() to give the candidate position rather than the current one.
- If the candidate rectangle includes a wall, then the movement along that axis is rejected (and it bounces instead).
This means that as long as actors start outside of walls, they should never end up inside a wall.
There are many minor improvements that could be made -- for example, placing the actor exactly against the wall after it collides. But I've tried to keep it simple to demonstrate only the important concepts.
Note that none of this is the 'right' way to do collisions or anything else in pico-8 -- it's just the way I happen to do it.
If you have any questions about how it works, don't be shy!
EDIT: another example -- this time also with actor collisions.
Exactly the same principle, but instead of looking for solid walls, it searches through all the actors and checks for overlapping actor collision rectangles.










A music cart. Feel free to use for anything, especially if you can think of a game that would be called Droid Boots.
There isn't yet a good way to copy music between carts, but if you save as .p8, you can paste the sfx and music data using a text editor.








The last inventories thing I needed for 0.3.3: adaptive formatting (an extreme example). Each inventory item is assigned a group (left, middle, right), and it does its best to figure out how to format everything in a sensible way that doesn't jump around too much and doesn't overlap. I had to be careful not to end up with a 1996 html table renderer!
It's possible with the new inventory system to display the capacity of an item (e.g. empty slots for up to 5 potions), to draw different icons for wielded or carried, and to draw different icons depending on how much ammo each one has.
To handle 1p vs multiplayer inventories, you can tag animations with context information -- how many players should exist for them to be displayed and with which attributes. For example, a single player inventory might show a row of potions, but when playing multiplayer it might be displayed as a single icon with a number to save space.
There's not long to go before 0.3.3 -- just a few microscripting details and converting legacy cartridges over to the new system on load. 0.3.4 will be a smaller follow-up, so let me know if there's something you're hanging out for, and I'll see if I can bump it up, or make sure it will be possible with Lua scripting later on. Things that were recently mentioned and are already confirmed:
- pico-8 music tracker and music triggering (and some new music!)
- custom inventories with selection and/or button bindings
- inventory microscripting (check for number of arrows in a quiver etc.)
- items that share the same ammo (e.g. all spells cost MP)
- id duplication and aliasing bugs after copy/paste
- fixed density allowing actors to sink in liquid
- scroll-wheel zoom, mb3 camera movement , alt-click mb2 emulation
- fixed total playtime bug for speedruns, made restarts faster
There are a few things that are wishlisted, but might be better suited to Lua scripting later on:
- player selection menu
- separate inventory menu
- assigning chase targets to monsters (for waypoints or making snakey monsters)
- arcade style lives




This is a quick demo of cart data compression, in order to fit more gfx / maps / music / whatever on a single cart. It's not set up to be a useful tool yet, but you can adapt it if you're keen!
It comes with two functions: comp and decomp that can be used to compress a section of memory to another location, and then back again. You'd only need to include decomp() in the release version of your cart, which is around 95 tokens.
comp(source_addr, destination_addr, length) decomp(source_addr, destination_addr, length) |
If you'd like to try it on your own data to see what kind of compression ratios you can get, copy and paste the program into your cart and then change this line near the end:
len = comp(0x2000,0x6000,0x1000)
0x2000 is where to compress from (in this case, the map -- see pico8.txt and search for memory layout)
0x6000 where to compress to. In this case, the screen -- as a way to visualize what's going on
0x1000 the length of the data to compress. 0x1000 (4k) is the top half of the map.
So if you want to try compressing the first 16 SFXs (68 bytes each), use:
len = comp(0x3200, 0x6000, 68*16)






The general strategy for developing Voxatron's toolset is to provide specialized features (modifiers, microscripting, physics properties etc) that capture 90% of a typical designer's requirements, and then leave the rest to Lua scripting. Lua will be kind of like a glue that that holds the engine together and fills in the gaps of functionality.
Working on custom player inventories and menus that have a plethora of possible requirements, I feel I've hit that 90% boundary. The engine is now complete enough that it is possible to create a Lua API that is grounded in something stable and maintainable. For this purpose, I've created a text editor that can be used within Designer, and a custom version of Lua designed to work efficiently with Voxatron (both of which you can see in action in PICO-8). It's time to (carefully) plug everything in and see what happens!
It will also be possible to write cartridges from scratch in Lua, of course. This would be handy for making games that need their own style of physics, or things like RTS, sim or puzzle games that deviate a lot from typical Voxatron shooty-runny things. The purest cartridge can contain simply one Lua script, and no rooms or object definitions.
If all goes well, I'll start to roll out a minimal API later next month for anyone to experiment with. It is a typical object-wise callback scheme, where things happening in the world/engine call Lua functions that the cart designer provides.
Here's a simple example:
[vine]eiTpKIL2eLZ





PICO-8 0.1.1 is now available! Grab it from the Updates page.
Note that PICO-8 is available to all Voxatron alpha users (including bundle customers). You may need to activate your account, or log in via email if you don't have a username/password already set up.
I'm doing things a little out of order here.. a full introductory post to PICO-8 will follow in a bit for those who haven't been around lately, but for now here's a rundown of new stuff in 0.1.1..
1. Gif saving! Press F9 to save the last 8 seconds (or F8 to set a starting point if you wish)

2. Token counting.
Instead of limiting cartridges to ~15k of ascii text, the primary limit is now 8192 tokens. I say primary limit, because the character count still stands, but is now 32k -- in practice the token limit is almost always reached first. There is actually also a third limit when saving cartridges -- the code must compress to the original 15k allocation. Exceeding this is extremely rare and you can probably ignore it! To get the status of your program, use the new INFO() command.
There aren't currently any cartridges that I know of that go over 8k tokens, and in general this change will give you around 20~30% more space.
[b]3. Freeform sprite and map editing






